Hive Configuraion

set dfs.block.size; -- 查看集群设置文件块的大小

--mapper configuraion

set mapreduce.input.fileinputformat.split.maxsize=128000000;--启动map最大的切片大小,越小,mapper越多,大量数据时设置应低一点

set mapred.max.split.size=100000000; --maperd切分的大小,包含以下的三个主要是用来执行map之前合并小文件,从而减少map数

set mapred.min.split.size.per.node=100000000; --maper每个节点处理最小文件的大小

set mapred.min.split.size.per.rack=100000000; -- maper每个机架处理最小文件的大小

set mapreduce.map.memory.mb=2048; --每个map task的最大内存

set mapreduce.map.java.opts='-Xmx900M'; --设置map的进程内存,是jvm参数,包含GC策略

--reducer configuration

set hive.exec.reducers.bytes.per.reducer=256000000; --配置每个reducer处理的字节数,越小,reducer的task越多

set mapreduce.reduce.java.opt='-Xmx8192M'; -- 配置每个reducer的进程内存

set mapreduce.reduce.memory.mb=8192; --配置每个reducer的内存

set mapred.reduce.tasks=1000; --设置reduce的任务数

--join configuration

set hive.mapjoin.smalltable.filesize = 3000; -- mapjoin为hive的一种优化操作,适用于小表join大表的场景,配置该参数主要确定优化表的大小,小于相应值则会被加载入内存

set hive.map.aggr=true; --提前合并小文件

set hive.auto.convert.join=true; --开启mapjoin的转换操作,将小表刷入内存中

set hive.skewjoin.key=100000; --join时,控制每个reduce的处理的数据值

set hive.optimize.skewjoin=true; --这三设置主要解决数据倾斜问题

set hive.exec.parallel=true;--嵌套sql的并行优化

set mapreduce.job.reduce.slowstart.completedmaps=0.9:当map task完成的比例达到该值后才会为reduce task申请资源,默认是0.5。
set yarn.app.mapreduce.am.job.reduce.rampup.limit:在map task完成之前,最多启动reduce task比例,默认是0.5
set yarn.app.mapreduce.am.job.reduce.preemption.limit:当map task需要资源但暂时无法获取资源(比如reduce task运行过程中,部分map task因结果丢失需重算)时,为了保证至少一个map task可以得到资源,最多可以抢占reduce task比例,默认是0.5

说明:

  1. 当数据量较大时,可以适当增加各个maper、reducer的内存;而当join或嵌套的数据较多时,是修改数据的并行数
  2. mapper是处理行数据时的任务。mapper数代表产生对应的小文件数,并行数越多,小文件数越多,其创建、初始化需要的时间越长,但是同时处理的数据越多;而并发度越少,集群资源利用率越小
  3. reducer是处理聚合的任务。reducer越多,小文件的产生会对节点产生影响;但reducer设置过小,单个reducer处理的数据量较大,容易长生OOM异常。
  4. 相关全局操作只有一个reducer:order by、distinct、笛卡尔积等

数据倾斜

主要包含两方面:join造成的倾斜和group by造成的倾斜,数据倾斜一般发生在reducer阶段,表现为卡在后几个任务基本不动

常见的倾斜原因包含:

  1. 数据分配不均,join连接键or groupby对象存在量级较高的数据和量级较低的数据

可参考:http://www.iteye.com/news/32360

基本配置:

set mapreduce.input.fileinputformat.split.maxsize=128000000;

set mapred.max.split.size=100000000;

set mapred.min.split.size.per.node=100000000;

set mapred.min.split.size.per.rack=100000000; 

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

set hive.exec.reducers.bytes.per.reducer=256000000;

set mapreduce.reduce.java.opt='-Xmx8192M';

set mapred.child.reduce.java.opts='Xmx4096m';

set mapreduce.reduce.memory.mb=8192;

set hive.mapjoin.smalltable.filesize = 5000;

set hive.map.aggr=true;

set hive.auto.convert.join=true;

set hive.skewjoin.key=100000;

set hive.optimize.skewjoin=true;

或者

Maper: 
      mapreduce.map.java.opts="-Xmx1024m"
      ( mapred.map.child.java.opts="-Xmx2048m"(默认参数,表示jvm堆内存)         
        mapred.child.map.java.opts="-Xmx1024m")
      mapreduce.map.memory.mb=2304(默认参数,表示整个jvm进程占用的内存:堆内存+堆外内存=2048+256)

Reducer:
     mapreduce.reduce.java.opts="-Xmx1024m"
     ( mapred.reduce.child.java.opts="-Xmx2048m"(默认参数,表示jvm堆内存)
       mapred.child.reduce.java.opts="-Xmx1024m")
     mapreduce.reduce.memory.mb=2304(默认参数,表示整个jvm进程占用的内存:堆内存+堆外内存=2048+256)

MRAppMaster:
yarn.app.mapreduce.am.command-opts="-Xmx1024m"(默认参数,表示jvm堆内存)
     yarn.app.mapreduce.am.resource.mb=1536(默认参数,表示整个jvm进程占用的内存:堆内存+堆外内存=1024+512)

SET mapreduce.reduce.memory.mb=8048 ;
SET mapreduce.reduce.java.opts='-Xmx8048M';
SET mapreduce.map.memory.mb=1024;
SET mapreduce.map.java.opts='-Xmx900M';
SET mapred.child.java.opts=-Xmx900m;
SET mapred.child.map.java.opts='-Xmx900M';

results matching ""

    No results matching ""